// call
function partial(fn, str1, str2) {
    function result(str3) {
        return fn.call(this, str1, str2, str3)
    }

    return result
}

// apply
function partial(fn, str1, str2) {
    function result(str3) {
        return fn.apply(this, [str1, str2, str3])
    }

    return result
}

// bind 详细版
function partial(fn, str1, str2) {
    function result(str3) {
        return fn.bind(this, str1, str2)(str3)
    }

    return result
}

// bind 剪头函数版
function partial(fn, str1, str2) {
    const result = (str3) => fn(str1, str2, str3)
    return result
}

// bind 简略版
function partial(fn, str1, str2) {
    return fn.bind(this, str1, str2)
}

function partialUsingArguments(fn) {
    const OuterArgs = Array.prototype.slice.call(arguments, 1);
    const res = function () {
        const resArgs = Array.prototype.slice.call(arguments);
        return fn.apply(this, OuterArgs.concat(resArgs));
    };
    return res;
}


